package com.solr.self.search;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;

/**
 * 
 * <solrj公共方法封装类>
 * <功能详细描述>
 * 
 * @author  huanglizhi
 * @version  [版本号, 2012-7-10]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
public class SolrjCommonUtil {
	
	/**
	 * <设置特殊属性，包含要返回的字段、排序、高亮>
	 * <注意减少searching过程中不必要的component执行过程，提高效率>
	 * @param query
	 * @param sbpo [参数说明]
	 * 
	 * @return void [返回类型说明]
	 * @exception throws [违例类型] [违例说明]
	 * @see [类、类#方法、类#成员]
	 */
	public static void SetSpecialProperties(SolrQuery query, SolrSearchBasePO sbpo){
		// 设置要返回的字段
		query.setParam("fl", sbpo.getFl());
		
		// 设置排序字段
		Iterator<String> orderIt = sbpo.getOrderMap().keySet().iterator();
		while (orderIt.hasNext()) {
			String order_field = orderIt.next();
			query.setSortField(order_field, sbpo.getOrderParam(order_field));
		}
		
		// 做如下判断主要是为了减少searching过程中不必要的component执行过程
		if (sbpo.getIs_hl()) {
			// 设置是否高亮以及高亮字段，如果未设置前后缀，solr默认加上<em></em>
			query.setHighlightSimplePre("<font color=\"red\">"); //标记，高亮关键字前缀
	    	query.setHighlightSimplePost("</font>"); //后缀
			query.setParam("hl", sbpo.getIs_hl());
			query.setParam("hl.fl", sbpo.getHl_fl());
		}
		
	}
	
	/**
	 * <设置分组属性>
	 * <功能详细描述>
	 * @param query
	 * @param sbpo [参数说明]
	 * 
	 * @return void [返回类型说明]
	 * @exception throws [违例类型] [违例说明]
	 * @see [类、类#方法、类#成员]
	 */
	public static void SetFacet(SolrQuery query, SolrSearchBasePO sbpo){
		
		// 做如下判断主要是为了减少searching过程中不必要的component执行过程
		if (sbpo.getIs_facet()) {
			// 设置排序字段
			Iterator<String> facetIt = sbpo.getFacetParamList().iterator();
			while (facetIt.hasNext()) {
				query.addFacetField(facetIt.next());
			}
		}
		// 设置返回结果>=1的记录
		query.setFacetMinCount(1);
	}
	
	/**
	 * <将高亮后的数据填充doc>
	 * <功能详细描述>
	 * @param query
	 * @param sbpo [参数说明]
	 * 
	 * @return void [返回类型说明]
	 * @exception throws [违例类型] [违例说明]
	 * @see [类、类#方法、类#成员]
	 */
	public static void SetHighlightData(QueryResponse rsp, SolrDocumentList docs, SolrSearchBasePO sbpo){
		// 循环SolrDocumentList的值
		for (SolrDocument solrDocument : docs) {
			// 取出每条记录的唯一标识id
			String id=(String) solrDocument.getFieldValue("id");
			if (StringHelper.isNotNullAndEmpty(rsp.getHighlighting())) {
				// 如果高亮字段不为空，则循环高亮字段并将高亮后的数据填充到doc该字段中
				if (StringHelper.isNotNullAndEmpty(sbpo.getHl_fl())) {
					String[] hl_fl = sbpo.getHl_fl().split(",");
					List<String> highlightFieldValue = null;
					for (int i = 0; i < hl_fl.length; i++) {
						highlightFieldValue = rsp.getHighlighting().get(id).get(hl_fl[i]);
						solrDocument.setField(hl_fl[i], highlightFieldValue.get(0));
					}
				}
			}
		}
	}
	
	/**
	 * <将SolrDocument格式数据转化为Map格式输出>
	 * <功能详细描述>
	 * @param docs [参数说明]
	 * 
	 * @return List<Map<String,Object>> [返回类型说明]
	 * @exception throws [违例类型] [违例说明]
	 * @see [类、类#方法、类#成员]
	 */
	public static List<Map<String,Object>> SolrDocumentConvertToMap(SolrDocumentList docs){
		List<Map<String,Object>> dataList = new ArrayList<Map<String,Object>>();
		
//		System.out.println("docs:"+docs.toString());
		// 循环SolrDocumentList的值
		for (SolrDocument solrDocument : docs) {
			// 直接调用solrDocument中已有的方法
			Map<String, Object> dataMap = solrDocument.getFieldValueMap();
			dataList.add(dataMap);
		}
		return dataList;
	}
	
	/**
	 * <将SolrDocument格式数据转化为Map格式输出>
	 * <功能详细描述>
	 * @param docs [参数说明]
	 * 
	 * @return List<Map<String,Object>> [返回类型说明]
	 * @exception throws [违例类型] [违例说明]
	 * @see [类、类#方法、类#成员]
	 */
	public static List<Map<String,Object>> SolrDocumentConvertToMap2(SolrDocumentList docs){
		List<Map<String,Object>> dataList = new ArrayList<Map<String,Object>>();
		
//		System.out.println("docs:"+docs.toString());
		// 循环SolrDocumentList的值
		for (SolrDocument solrDocument : docs) {
			Map<String, Object> dataMap = new HashMap<String, Object>();
//			dataMap = solrDocument.getFieldValueMap();
			for(Iterator<Map.Entry<String, Object>> it = solrDocument.iterator(); it.hasNext(); )
            {
				Map.Entry<String, Object> docMap = it.next();
				dataMap.put(docMap.getKey(), docMap.getValue());
            }
			dataList.add(dataMap);
		}
		return dataList;
	}
	
}
